package com.cardbaobao.cardbabyclient.utils;

import android.content.Context;
import android.content.SharedPreferences;

/**
 * Created by Jiangzx on 16:55.
 * 账号限制相关工具类，依照一定的规则对账号进行限制
 */

public class AccountLimitUtils {
    private static final String LIMIT_FILE_NAME="account_limit";
    private static final long ONE_HOUR_MILLISECONDS=1000*60*60L;//1小时毫秒数
    /**验证码错误次数上限，默认为10次*/
    private static final int VERIFY_CODE_ERROR_LIMIT=10;
    /**验证码错误次数有效时间，超过这个时间需清空，默认为2小时*/
    public static final int VERIFY_CODE_ERROR_VALIDATE_TIME=2;
    /**登录密码错误次数上限，默认为5次*/
    private static final int ACCOUNT_LOGIN_ERROR_LIMIT=5;
    /**登录密码错误次数有效时间，超过这个时间后清零，默认为2小时*/
    public static final int ACCOUNT_LOGIN_ERROR_VALIDATE_TIME=2;
    /**
     * 累加验证码验证错误次数
     * @param applicationContext 建议传入全局applicationContext
     */
    public static void accumulateVerifyCodeError(Context applicationContext){
        if(applicationContext!=null){
            SharedPreferences sharedPreferences=applicationContext.getSharedPreferences(LIMIT_FILE_NAME,
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor=sharedPreferences.edit();
            int count=sharedPreferences.getInt("verifyCodeErrorCount",0);
            count++;
            if(count>=VERIFY_CODE_ERROR_LIMIT){
                editor.putLong("lastVerifyCodeErrorTimestamp",System.currentTimeMillis());
            }
            editor.putInt("verifyCodeErrorCount",count).apply();
        }
    }

    /**
     * 累加账号登录错误次数
     * @param applicationContext 建议传入application类型的context
     */
    public static void accumulateAccountLoginError(Context applicationContext){
        if(applicationContext!=null){
            SharedPreferences sharedPreferences=applicationContext.getSharedPreferences(LIMIT_FILE_NAME,
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor=sharedPreferences.edit();
            int count=sharedPreferences.getInt("accountLoginErrorCount",0);
            count++;
            if(count>=ACCOUNT_LOGIN_ERROR_LIMIT){
                editor.putLong("lastAccountLoginErrorTimestamp",System.currentTimeMillis());
            }
            editor.putInt("accountLoginErrorCount",count).apply();
        }
    }

    /**
     *是否允许验证码操作
     * @param applicationContext context，建议用application类型的context
     * @return 是否允许验证码操作，校验验证码/发送验证码
     */
    public static boolean allowVerifyCodeOperate(Context applicationContext){
        boolean result=true;
        //先获取输错次数
        if(applicationContext!=null){
            SharedPreferences sharedPreferences=applicationContext.getSharedPreferences(LIMIT_FILE_NAME,
                    Context.MODE_PRIVATE);
            int count=sharedPreferences.getInt("verifyCodeErrorCount",0);
            if(count>=VERIFY_CODE_ERROR_LIMIT){
                //超过验证码输入错误次数，检查最后一次验证码错误输入时间
                long errorTime=sharedPreferences.getLong("lastVerifyCodeErrorTimestamp",0L);
                if(System.currentTimeMillis()-errorTime>
                        VERIFY_CODE_ERROR_VALIDATE_TIME*ONE_HOUR_MILLISECONDS){
                    //当前时间-最后一次验证码输入错误时间
                    //大于错误限制时间，解除限制
                    sharedPreferences.edit().putInt("verifyCodeErrorCount",0).apply();
                }else{
                    result=false;
                }
            }
        }
        return result;
    }

    /**
     * 是否允许账号登录
     * @param applicationContext context 建议传入application类型的context
     * @return 是否可以登录账号
     */
    public static boolean allowAccountLoginOperate(Context applicationContext){
        boolean result=true;
        if(applicationContext!=null){
            SharedPreferences sharedPreferences=applicationContext.getSharedPreferences(LIMIT_FILE_NAME,
                    Context.MODE_PRIVATE);
            int count=sharedPreferences.getInt("accountLoginErrorCount",0);
            if(count>=ACCOUNT_LOGIN_ERROR_LIMIT){
                //超过密码错误次数，检查最后一次验证码错误输入时间
                long errorTime=sharedPreferences.getLong("lastAccountLoginErrorTimestamp",0L);
                if(System.currentTimeMillis()-errorTime>
                        ACCOUNT_LOGIN_ERROR_VALIDATE_TIME*ONE_HOUR_MILLISECONDS){
                    //当前时间-最后一次验证码输入错误时间
                    //大于错误限制时间，解除限制
                    sharedPreferences.edit().putInt("accountLoginErrorCount",0).apply();
                }else{
                    result=false;
                }
            }
        }
        return result;
    }
}
